<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /*
      for...in: symbol、不可枚举属性获取不到
      Object.keys： symbol和不可枚举属性获取不到
      JSON.stringify： 不可枚举属性、属性值是symbol、属性值是函数、属性值是undefined会忽略
      getOwnPropertyNames： 可以获取到不可枚举属性、不能获取到symbol属性
      getOwnPropertySymbols： 只能获取到symbol属性
      Reflect.ownKeys：可以获取到对象中的所有属性
    */
    const symbol = Symbol(1)
    const functionName = function() {}
    const obj = {
      b: undefined,
      [functionName]: 2,
      [symbol]: 1,
    }
    // 添加一个不可枚举属性
    Object.defineProperty(obj, 'a', {
      value: 'hhhh',
    })
    console.log('Object.keys', Object.keys(obj)); //['b', 'function() {}']
    console.log('JSON.stringify', JSON.stringify(obj)); //{"function() {}":2}
    console.log('getOwnPropertyNames', Object.getOwnPropertyNames(obj)); //['b', 'function() {}', 'a']
    console.log('getOwnPropertySymbols', Object.getOwnPropertySymbols(obj)); //[Symbol(1)]
    console.log('Reflect', Reflect.ownKeys(obj)); //['b', 'function() {}', 'a', Symbol(1)]
    
    for(let i in obj) {
      console.log(i); //'b', 'function() {}'
    }
  </script>
</body>
</html>